This invention relates to the field of data networking, and specifically to systems and methods of optimizing network communications. Networking protocols are often described in terms of the Open Systems Interconnection (OSI) model. Within the OSI model, the transport layer provides for reliable delivery of data, typically encapsulated in network packets, from a sender to receiver. To ensure complete and reliable data transfer, the transport layer is typically responsible for error detection and recovery and flow control. Common transport layer protocols include the transmission control protocol (TCP) and User Datagram Protocol (UDP).
To implement reliable data delivery, TCP uses the well-known Automatic Repeat reQuest (ARQ) technique. Specifically, the receiver explicitly acknowledges data as it is received. If data is not acknowledged by the receiver within a time period, the sender presumes this data is lost and retransmits the data.
TCP also seeks to prevent network congestion. Congestion occurs when packets are injected into a network at a rate faster than the network is able to deliver them. Network devices tolerate brief bursts of data by buffering (alternatively called queuing) incoming packets until they can be delivered. Because the memory available in network devices for packet queues is limited and because queuing introduces extra latency, the amounts of data that can be queued by network devices on a network are limited. When network packets arrive so quickly that they cannot all be queued, a network device discards or drops some network packets. Eventually, the sender detects that some network packets have been dropped and will retransmit this data. The mismatch between packet transmission rate and the network capacity, and the resulting packet loss, is congestion.
TCP congestion avoidance systems work by detecting packet loss due to congestion in the network. Upon detecting network congestion, TCP congestion avoidance systems will reduce the rate of network traffic to alleviate network congestion. A congestion control algorithm seeks to limit network congestion by adjusting the rate at which data is sent from a host or application to match the amount of available bandwidth, thus avoiding the condition where network queues fill up indefinitely and cause sustained and undesirable packet loss.
Typical TCP congestion avoidance systems specify the maximum amount of data that may be unacknowledged at any time. This limit is referred to as a congestion window. A sender will temporarily stop transmitting data when the amount of unacknowledged data equals the size of the congestion window and will resume data transmission as data is acknowledged by the receiver or presumed lost. Typically, network devices incrementally increase the size of their congestion windows as long as there is no symptoms of network congestion. As the network becomes congested, queues within network devices become full and cause packet loss. When the sender detects lost or dropped packets, it reduces the size of the congestion window, thereby reducing the data transmission rate and any network congestion.
Typically, the network layer, such as Internet Protocol or IP, underlying the transport layer does not provide explicit feedback to network devices about network congestion. Instead, network devices infer whether the network is congested based upon their own observations of packet loss.
In many networks, congestion is indeed the predominant source of packet loss so this algorithm works well in general. However, when network data is transferred over a lossy network connection, such as wireless or satellite network connection, network packets may be lost even if there is no network congestion. For example, radio interference will often cause the loss or corruption of some network packets in wireless network connections, regardless of the rate of data transmission. Previous congestion avoidance systems misinterpret this network packet loss as a sign of network congestion and reduce the transmission rate of network traffic unnecessarily. As a result, lossy network connections operate slower than necessary and are under-utilized.
To counteract this, some prior network devices employ Forward Error Correction (FEC) to detect and correct lost or corrupt network packets. At the sending network device, FEC analyzes the data being transmitted and creates extra error correction data. The original network data and the error correction data are then sent to the receiving network device. The receiving network device can use this error correction data to detect lost data and potentially recover small amounts of corrupt data. By recovering some corrupted data, FEC reduces the rate of packet loss over lossy network connections.
However, even with FEC, there will still be some packet loss over network connections, resulting in network under-utilization. Moreover, FEC requires the transmission of additional error correction information. Thus, any increases in network performance due to reduced packet loss from FEC are reduced if not eliminated by the amount of network bandwidth required to communicate the extra error correction information.
It is therefore desirable for a system and method to provide improved network performance over lossy network connections. It is desirable for the system and method to distinguish between the packet loss inherent in lossy network connections and the packet loss due to network congestion. It is further desirable for the system and method to operate without requiring additional network bandwidth or overhead for error correction data.